package redis

import (
	"gogo/log"
	"gogo/utils"

	"github.com/go-redis/redis"
)

var (
	mp_db_redis *Redis_Class
)

func This() *Redis_Class {
	if mp_db_redis == nil {
		mp_db_redis = &Redis_Class{}
	}
	return mp_db_redis
}

type Redis_Class struct {
	mpDbMap        map[int]*redis.Client
	mFuncErrHandle func(error) bool
}

func (c *Redis_Class) RegistErrHandle(f func(error) bool) {
	c.mFuncErrHandle = f
}

func (c *Redis_Class) RunErrHandle(err error) bool {
	if c.mFuncErrHandle != nil {
		return c.mFuncErrHandle(err)
	}
	return false
}

func (c *Redis_Class) GetDB(db int) *redis.Client {
	if c.mpDbMap != nil {
		if redisdb, ok := c.mpDbMap[db]; ok {
			return redisdb
		}
	}
	return nil
}

func (c *Redis_Class) Init(opt *redis.Options) bool {
	if c.mpDbMap == nil {
		c.mpDbMap = make(map[int]*redis.Client)
	}

	if _, ok := c.mpDbMap[opt.DB]; ok {
		return true
	}

	var redisdb *redis.Client

	for {
		//连接服务器
		if redisdb = redis.NewClient(opt); redisdb == nil {
			log.This().Error("Redis初始化失败\n")
			utils.This().TimeSleepSecond(1)
			continue
		}
		break
	}

	for {
		if _, err := redisdb.Ping().Result(); err != nil { //心跳
			log.This().ErrorF("Redis: %s", err)
			utils.This().TimeSleepSecond(1)
			continue
		}
		break
	}

	c.mpDbMap[opt.DB] = redisdb
	return true
}
